---
id: websocketheartbeat
title: Websocket心跳设置
---

### 定义

命名空间：TouchSocket.Http.WebSockets <br/>
程序集：[TouchSocket.Http.dll](https://www.nuget.org/packages/TouchSocket.Http)

## 一、说明

Websocket拥有自己的心跳数据格式，和响应心跳格式，专业名词是Ping和Pong。所以依靠这两个，可以直接实现心跳。

## 二、心跳配置

#### 2.1 服务器配置

服务器在添加WebSocket功能时，可以直接启用自动回应Ping。

```csharp {12}
var service = new HttpService();
await service.SetupAsync(new TouchSocketConfig()//加载配置
    .SetListenIPHosts(7789)
    .ConfigureContainer(a =>
    {
        a.AddConsoleLogger();
    })
    .ConfigurePlugins(a =>
    {
        a.UseWebSocket()//添加WebSocket功能
               .SetWSUrl("/ws")
               .UseAutoPong();//当收到ping报文时自动回应pong
    }));

await service.StartAsync();
```

:::tip 提示

**UseAutoPong**非必须操作，如果不设置的话，自己在插件处理Ping报文也可以。

:::  

#### 2.2 客户端使用心跳插件

```csharp {10-11}
var client = new WebSocketClient();
await client.SetupAsync(new TouchSocketConfig()
    .SetRemoteIPHost("ws://127.0.0.1:7789/ws")
    .ConfigureContainer(a =>
    {
        a.AddFileLogger();
    })
    .ConfigurePlugins(a =>
    {
        a.UseWebSocketHeartbeat()//使用心跳插件
        .SetTick(TimeSpan.FromSeconds(1));//每5秒ping一次。
    }));
await client.ConnectAsync();
```

## 三、直接发送心跳

直接发送心跳，可以直接使用扩展方法。
```csharp showLineNumbers 
client.Ping();
client.Pong();
```

或者自己构建数据帧
```csharp showLineNumbers
WSDataFrame dataFrame = new WSDataFrame()
{
    FIN = true,
    Opcode = WSDataType.Ping
};

//WSDataFrame dataFrame = new WSDataFrame()
//{
//    FIN = true,
//    Opcode = WSDataType.Pong
//};

client.SendAsync(dataFrame);
```

:::caution 注意

自己构建数据帧，还应该设置Make等其他参数。

:::  

:::tip 提示

无论是Ping，还是Pong，服务器和客户端都支持发送和接收。但是一般建议由客户端Ping，服务器只负责Pong即可。

:::  

[本文示例Demo](https://gitee.com/RRQM_Home/TouchSocket/tree/master/examples/WebSocket/WebSocketConsoleApp)
